//
// Created by cmz2000 on 2021/8/4.
//

#ifndef DNSRELAY_MAIN_H
#define DNSRELAY_MAIN_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <WinSock2.h>

#pragma comment(lib, "ws2_32.lib");

#define LOCAL_DNS_IP "127.0.0.1"//本地DNS地址
#define SERVER_DNS_IP "192.168.199.1"//外部DNS地址（改成自己的DNS服务器地址）
#define PATH "../dnsrelay.txt"
#define DNS_PORT 53//DNS服务端口
#define BUF_SIZE 512//缓存区大小
#define LENGTH 1024//域名最大长度
#define AMOUNT 1000//DNS域名解析表或转换表最大条数

//DNS域名解析表结构
typedef struct ipanddomain {
    char ip[LENGTH];//IP地址
    char domain[LENGTH];//域名
} IPandDomain;

//ID转换表结构
typedef struct idchange {
    unsigned short oldID;//原ID
    SOCKADDR_IN client;//请求者套接字地址
} IDchange;

extern IPandDomain DNS_table[AMOUNT];//DNS域名解析表
extern IDchange IDTransTable[AMOUNT];//ID转换表
extern int IDCount;//ID转换表中的条目个数
extern char URL[LENGTH];//域名

extern int getTable(char *path);//获取域名解析表
extern void getURL(char *recvBuf, int byteNum);//获取DNS请求中的域名
extern int find(int num);//判断是否在表中找到DNS请求的域名,找到则返回下标,否则返回-1,num为解析表条目数
extern unsigned short registerNewID(unsigned short old, SOCKADDR_IN temp);//将请求ID转换为新ID，并将信息写入ID转换表中
extern void display(unsigned short *oldID, unsigned short newID, int index, int level,
                    SOCKADDR_IN clientAddr, char *recvBuf);//打印调试信息


#endif //DNSRELAY_MAIN_H
